// TODO: 对象表达式、伴生对象、嵌套类
// DATE: 2022/3/28
// AUTHOR: Cheng Ze WUST
open class TestN{
    open fun add(info:String)= println("TestN add:$info")
    open fun del(info:String)= println("TestN del:$info")
}

class bansheng{ //伴生对象
    //在kotlin中没有static，伴生和java的static差不多
    companion object{
        val info="伴生Info"
        fun showInfo()= println("say:$info")
    }
}

class Body(_bodyInfo:String){   //嵌套类
    val bodyInfo=_bodyInfo
    //外部类可以访问内部的类
    fun show(){
        Heart().run()
    }
    //默认情况下内部的类不能访问外部的类，需要加inner修饰
    inner class Heart{
        fun run()= println("心脏访问身体信息：$bodyInfo")
    }
    inner class Hand{
        inner class LeftHand{
            fun run()= println("左手访问身体信息：$bodyInfo")
        }
        inner class RightHand{

        }
    }
}

fun main(args: Array<String>){
    val p:TestN=object : TestN(){   //匿名实现
        override fun add(info: String){
            println("匿名对象 add:$info")
        }
        override fun del(info: String){
            println("匿名对象 add:$info")
        }
    }
    p.add("Jiang")

    //具名实现方式
    val p2=TestNImpl()
    p2.add("Wang")

    //无论创建多少次bansheng伴生对象，其只会初始化一次
    println(bansheng.info)

    val tbody = Body("OokK")
    tbody.show()
    tbody.Hand().LeftHand().run()
}

//具名实现
class TestNImpl:TestN(){
    override fun add(info: String){
        println("具名对象 add:$info")
    }
    override fun del(info: String){
        println("具名对象 add:$info")
    }
}